/* Original Author:  Dominick O'Dierno
 * Date: 2007   odiernod@gmail.com     --Originally intended for use with DOMercury:  http://www.odierno.com/domercury
 * Description: Giant list of Win32 API functions, many of which are not used, but the may be in the future so I left them here anyway.
 * 
 * --CHANGELOG--
 * 
 * */

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace DOMercury
{
    [ComVisible(false)]
    public class Win32
    {
        #region Constants
        /// <summary>
        /// 
        /// </summary>
        public const int LVS_REPORT = 0x0001;
        /// <summary>
        /// 
        /// </summary>
        public const int LVS_SHOWSELALWAYS = 0x0008;
        /// <summary>
        /// 
        /// </summary>
        public const int LVS_OWNERDATA = 0x1000;

        /// <summary>
        /// 
        /// </summary>
        public const int LVIF_TEXT = 0x0001;
        /// <summary>
        /// 
        /// </summary>
        public const int LVIF_IMAGE = 0x0002;
        /// <summary>
        /// 
        /// </summary>
        public const int LVIF_STATE = 0x0008;
        /// <summary>
        /// 
        /// </summary>
        public const int LVIF_INDENT = 0x0010;

        /// <summary>
        /// 
        /// </summary>
        public const int WM_DESTROY = 0x0002;
        /// <summary>
        /// 
        /// </summary>
        public const int WM_NOTIFY = 0x004E;

        /// <summary>
        /// 
        /// </summary>
        public const int LVN_FIRST = -100;
        /// <summary>
        /// 
        /// </summary>
        public const int LVN_ITEMCHANGED = LVN_FIRST - 1;
        /// <summary>
        /// 
        /// </summary>
        public const int LVN_ODCACHEHINT = LVN_FIRST - 13;
        /// <summary>
        /// 
        /// </summary>
        public const int LVN_GETDISPINFOW = LVN_FIRST - 77;
        /// <summary>
        /// 
        /// </summary>
        public const int LVN_ODFINDITEMW = LVN_FIRST - 79;

        /// <summary>
        /// 
        /// </summary>
        public const int LVM_FIRST = 0x1000;
        /// <summary>
        /// 
        /// </summary>
        public const int LVM_GETITEMCOUNT = LVM_FIRST + 4;
        /// <summary>
        /// 
        /// </summary>
        public const int LVM_DELETEALLITEMS = LVM_FIRST + 9;
        /// <summary>
        /// 
        /// </summary>
        public const int LVM_GETNEXTITEM = LVM_FIRST + 12;
        /// <summary>
        /// 
        /// </summary>
        public const int LVM_GETITEMRECT = LVM_FIRST + 14;
        /// <summary>
        /// 
        /// </summary>
        public const int LVM_GETTOPINDEX = LVM_FIRST + 39;
        /// <summary>
        /// 
        /// </summary>
        public const int LVM_SETITEMCOUNT = LVM_FIRST + 47;
        /// <summary>
        /// 
        /// </summary>
        public const int LVM_GETSELECTEDCOUNT = LVM_FIRST + 50;
        /// <summary>
        /// 
        /// </summary>
        public const int LVM_GETITEM = LVM_FIRST + 75;

        /// <summary>
        /// 
        /// </summary>
        public const int LVNI_SELECTED = 0x0002;

        /// <summary>
        /// 
        /// </summary>
        public const int LVSICF_NOINVALIDATEALL = 0x00000001;
        /// <summary>
        /// 
        /// </summary>
        public const int LVSICF_NOSCROLL = 0x00000002;
        #endregion
        #region Shell32 Extract Icon Prototypes
        [DllImport("Shell32.dll",EntryPoint="ExtractIconExW",CharSet=CharSet.Unicode, ExactSpelling=true,CallingConvention=CallingConvention.StdCall)]
        public static extern int ExtractIconEx(string sFile,int iIndex, out IntPtr piLargeVersion, out IntPtr piSmallVersion, int amountIcons);

        public static System.Drawing.Icon ExtractShell32Icon(int IconIndex)
        {
            IntPtr large, small;
            System.Drawing.Icon extractedIcon;
            ExtractIconEx("Shell32.dll", IconIndex, out large, out small, 1);
            extractedIcon = System.Drawing.Icon.FromHandle(small);
            return extractedIcon;
        }
       
        public enum Shell32Icons
        {
            GenericFile = 0,
            RichTextFile = 1,
            GenericApplication = 2,
            Folder = 3,
            OpenFolder = 4,
            BDrive = 5,
            ADrive = 6,
            Harddisk = 7,
            NetworkDrive = 9,
            NotConnectedNetworkDrive = 10,
            CDROM = 11,
            Microchip = 12,
            World = 13, 
            WorldMouse = 14,
            Monitor = 15,
            Printer = 16, 
            WorldAndComputer = 17,
            Network = 18,
            ScheduledTask = 20,
            Magnify = 22,
            Question = 23,
            Sleep = 25,
            Power = 27,
            Share = 28, 
            Recycle = 32,
            Desktop = 34,
            FontFolder = 38, 
            CDMedia = 40,
            Tree = 41,
            Star = 43, 
            OutlookKey = 44,
            Padlock = 47,
            ComputerSearch = 56,
            dll = 72,
            TruTypeFont = 74,
            Alert = 77,
            Defrag = 80,
            BatchFile = 90,
            No = 109,
            Power2 = 112,
            CD = 113,
            Movie = 115, 
            Music = 116,
            Photo = 117,
            MSNButterfly = 130, 
            Delete = 131,
            PlayButton = 137,
            CheckMark = 144,
            MobileDevice = 200,
            Wifi = 243,
        }



        #endregion
        #region Send message prototypes

        /// <summary>
        /// 
        /// </summary>
        /// <param name="hWnd"></param>
        /// <param name="msg"></param>
        /// <param name="wParam"></param>
        /// <param name="lParam"></param>
        /// <returns></returns>
        [DllImport("User32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        public static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam);

        /// <summary>
        /// 
        /// </summary>
        /// <param name="hWnd"></param>
        /// <param name="msg"></param>
        /// <param name="wParam"></param>
        /// <param name="lParam"></param>
        /// <returns></returns>
        [DllImport("User32.dll", SetLastError = true)]
        public static extern int SendMessage(IntPtr hWnd, int msg, int wParam, IntPtr lParam);

        /// <summary>
        /// 
        /// </summary>
        /// <param name="hWnd"></param>
        /// <param name="msg"></param>
        /// <param name="wParam"></param>
        /// <param name="lParam"></param>
        /// <returns></returns>
        [DllImport("User32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        public static extern int SendMessage(IntPtr hWnd, int msg, int wParam, int lParam);

        /// <summary>
        /// 
        /// </summary>
        /// <param name="hWnd"></param>
        /// <param name="msg"></param>
        /// <param name="wParam"></param>
        /// <param name="lvi"></param>
        /// <returns></returns>
        [DllImport("User32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        public static extern int SendMessage(IntPtr hWnd, int msg, int wParam, ref LVITEM lvi);

        /// <summary>
        /// 
        /// </summary>
        /// <param name="hWnd"></param>
        /// <param name="msg"></param>
        /// <param name="wParam"></param>
        /// <param name="prc"></param>
        /// <returns></returns>
        [DllImport("User32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        public static extern int SendMessage(IntPtr hWnd, int msg, int wParam, ref RECT prc);

        #endregion
        #region Show Window Prototypes
        [DllImport("user32.dll")]
        public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

        public enum WindowShowLParam : int
        {
            /// <summary>Hides the window and activates another window.</summary>
            /// <remarks>See SW_HIDE</remarks>
            Hide = 0,
            /// <summary>Activates and displays a window. If the window is minimized 
            /// or maximized, the system restores it to its original size and 
            /// position. An application should specify this flag when displaying 
            /// the window for the first time.</summary>
            /// <remarks>See SW_SHOWNORMAL</remarks>
            ShowNormal = 1,
            /// <summary>Activates the window and displays it as a minimized window.</summary>
            /// <remarks>See SW_SHOWMINIMIZED</remarks>
            ShowMinimized = 2,
            /// <summary>Activates the window and displays it as a maximized window.</summary>
            /// <remarks>See SW_SHOWMAXIMIZED</remarks>
            ShowMaximized = 3,
            /// <summary>Maximizes the specified window.</summary>
            /// <remarks>See SW_MAXIMIZE</remarks>
            Maximize = 3,
            /// <summary>Displays a window in its most recent size and position. 
            /// This value is similar to "ShowNormal", except the window is not 
            /// actived.</summary>
            /// <remarks>See SW_SHOWNOACTIVATE</remarks>
            ShowNormalNoActivate = 4,
            /// <summary>Activates the window and displays it in its current size 
            /// and position.</summary>
            /// <remarks>See SW_SHOW</remarks>
            Show = 5,
            /// <summary>Minimizes the specified window and activates the next 
            /// top-level window in the Z order.</summary>
            /// <remarks>See SW_MINIMIZE</remarks>
            Minimize = 6,
            /// <summary>Displays the window as a minimized window. This value is 
            /// similar to "ShowMinimized", except the window is not activated.</summary>
            /// <remarks>See SW_SHOWMINNOACTIVE</remarks>
            ShowMinNoActivate = 7,
            /// <summary>Displays the window in its current size and position. This 
            /// value is similar to "Show", except the window is not activated.</summary>
            /// <remarks>See SW_SHOWNA</remarks>
            ShowNoActivate = 8,
            /// <summary>Activates and displays the window. If the window is 
            /// minimized or maximized, the system restores it to its original size 
            /// and position. An application should specify this flag when restoring 
            /// a minimized window.</summary>
            /// <remarks>See SW_RESTORE</remarks>
            Restore = 9,
            /// <summary>Sets the show state based on the SW_ value specified in the 
            /// STARTUPINFO structure passed to the CreateProcess function by the 
            /// program that started the application.</summary>
            /// <remarks>See SW_SHOWDEFAULT</remarks>
            ShowDefault = 10,
            /// <summary>Windows 2000/XP: Minimizes a window, even if the thread 
            /// that owns the window is hung. This flag should only be used when 
            /// minimizing windows from a different thread.</summary>
            /// <remarks>See SW_FORCEMINIMIZE</remarks>
            ForceMinimized = 11

        }
        #endregion
        public enum Modifiers { MOD_ALT = 0x0001, MOD_CONTROL = 0x0002, MOD_SHIFT = 0x0004, MOD_WIN = 0x0008 }
        public static int SC_SCREENSAVE = 0xF140;
        /// <summary>
        /// Defines a delegate for Message handling
        /// </summary>
        public enum Msgs
        {
            WM_NULL = 0x0000,
            WM_CREATE = 0x0001,
            WM_DESTROY = 0x0002,
            WM_MOVE = 0x0003,
            WM_SIZE = 0x0005,
            WM_ACTIVATE = 0x0006,
            WM_SETFOCUS = 0x0007,
            WM_KILLFOCUS = 0x0008,
            WM_ENABLE = 0x000A,
            WM_SETREDRAW = 0x000B,
            WM_SETTEXT = 0x000C,
            WM_GETTEXT = 0x000D,
            WM_GETTEXTLENGTH = 0x000E,
            WM_PAINT = 0x000F,
            WM_CLOSE = 0x0010,
            WM_QUERYENDSESSION = 0x0011,
            WM_QUIT = 0x0012,
            WM_QUERYOPEN = 0x0013,
            WM_ERASEBKGND = 0x0014,
            WM_SYSCOLORCHANGE = 0x0015,
            WM_ENDSESSION = 0x0016,
            WM_SHOWWINDOW = 0x0018,
            WM_WININICHANGE = 0x001A,
            WM_SETTINGCHANGE = 0x001A,
            WM_DEVMODECHANGE = 0x001B,
            WM_ACTIVATEAPP = 0x001C,
            WM_FONTCHANGE = 0x001D,
            WM_TIMECHANGE = 0x001E,
            WM_CANCELMODE = 0x001F,
            WM_SETCURSOR = 0x0020,
            WM_MOUSEACTIVATE = 0x0021,
            WM_CHILDACTIVATE = 0x0022,
            WM_QUEUESYNC = 0x0023,
            WM_GETMINMAXINFO = 0x0024,
            WM_PAINTICON = 0x0026,
            WM_ICONERASEBKGND = 0x0027,
            WM_NEXTDLGCTL = 0x0028,
            WM_SPOOLERSTATUS = 0x002A,
            WM_DRAWITEM = 0x002B,
            WM_MEASUREITEM = 0x002C,
            WM_DELETEITEM = 0x002D,
            WM_VKEYTOITEM = 0x002E,
            WM_CHARTOITEM = 0x002F,
            WM_SETFONT = 0x0030,
            WM_GETFONT = 0x0031,
            WM_SETHOTKEY = 0x0032,
            WM_GETHOTKEY = 0x0033,
            WM_QUERYDRAGICON = 0x0037,
            WM_COMPAREITEM = 0x0039,
            WM_GETOBJECT = 0x003D,
            WM_COMPACTING = 0x0041,
            WM_COMMNOTIFY = 0x0044,
            WM_WINDOWPOSCHANGING = 0x0046,
            WM_WINDOWPOSCHANGED = 0x0047,
            WM_POWER = 0x0048,
            WM_COPYDATA = 0x004A,
            WM_CANCELJOURNAL = 0x004B,
            WM_NOTIFY = 0x004E,
            WM_INPUTLANGCHANGEREQUEST = 0x0050,
            WM_INPUTLANGCHANGE = 0x0051,
            WM_TCARD = 0x0052,
            WM_HELP = 0x0053,
            WM_USERCHANGED = 0x0054,
            WM_NOTIFYFORMAT = 0x0055,
            WM_CONTEXTMENU = 0x007B,
            WM_STYLECHANGING = 0x007C,
            WM_STYLECHANGED = 0x007D,
            WM_DISPLAYCHANGE = 0x007E,
            WM_GETICON = 0x007F,
            WM_SETICON = 0x0080,
            WM_NCCREATE = 0x0081,
            WM_NCDESTROY = 0x0082,
            WM_NCCALCSIZE = 0x0083,
            WM_NCHITTEST = 0x0084,
            WM_NCPAINT = 0x0085,
            WM_NCACTIVATE = 0x0086,
            WM_GETDLGCODE = 0x0087,
            WM_SYNCPAINT = 0x0088,
            WM_NCMOUSEMOVE = 0x00A0,
            WM_NCLBUTTONDOWN = 0x00A1,
            WM_NCLBUTTONUP = 0x00A2,
            WM_NCLBUTTONDBLCLK = 0x00A3,
            WM_NCRBUTTONDOWN = 0x00A4,
            WM_NCRBUTTONUP = 0x00A5,
            WM_NCRBUTTONDBLCLK = 0x00A6,
            WM_NCMBUTTONDOWN = 0x00A7,
            WM_NCMBUTTONUP = 0x00A8,
            WM_NCMBUTTONDBLCLK = 0x00A9,
            WM_KEYDOWN = 0x0100,
            WM_KEYUP = 0x0101,
            WM_CHAR = 0x0102,
            WM_DEADCHAR = 0x0103,
            WM_SYSKEYDOWN = 0x0104,
            WM_SYSKEYUP = 0x0105,
            WM_SYSCHAR = 0x0106,
            WM_SYSDEADCHAR = 0x0107,
            WM_KEYLAST = 0x0108,
            WM_IME_STARTCOMPOSITION = 0x010D,
            WM_IME_ENDCOMPOSITION = 0x010E,
            WM_IME_COMPOSITION = 0x010F,
            WM_IME_KEYLAST = 0x010F,
            WM_INITDIALOG = 0x0110,
            WM_COMMAND = 0x0111,
            WM_SYSCOMMAND = 0x0112,
            WM_TIMER = 0x0113,
            WM_HSCROLL = 0x0114,
            WM_VSCROLL = 0x0115,
            WM_INITMENU = 0x0116,
            WM_INITMENUPOPUP = 0x0117,
            WM_MENUSELECT = 0x011F,
            WM_MENUCHAR = 0x0120,
            WM_ENTERIDLE = 0x0121,
            WM_MENURBUTTONUP = 0x0122,
            WM_MENUDRAG = 0x0123,
            WM_MENUGETOBJECT = 0x0124,
            WM_UNINITMENUPOPUP = 0x0125,
            WM_MENUCOMMAND = 0x0126,
            WM_CTLCOLORMSGBOX = 0x0132,
            WM_CTLCOLOREDIT = 0x0133,
            WM_CTLCOLORLISTBOX = 0x0134,
            WM_CTLCOLORBTN = 0x0135,
            WM_CTLCOLORDLG = 0x0136,
            WM_CTLCOLORSCROLLBAR = 0x0137,
            WM_CTLCOLORSTATIC = 0x0138,
            WM_MOUSEMOVE = 0x0200,
            WM_LBUTTONDOWN = 0x0201,
            WM_LBUTTONUP = 0x0202,
            WM_LBUTTONDBLCLK = 0x0203,
            WM_RBUTTONDOWN = 0x0204,
            WM_RBUTTONUP = 0x0205,
            WM_RBUTTONDBLCLK = 0x0206,
            WM_MBUTTONDOWN = 0x0207,
            WM_MBUTTONUP = 0x0208,
            WM_MBUTTONDBLCLK = 0x0209,
            WM_MOUSEWHEEL = 0x020A,
            WM_PARENTNOTIFY = 0x0210,
            WM_ENTERMENULOOP = 0x0211,
            WM_EXITMENULOOP = 0x0212,
            WM_NEXTMENU = 0x0213,
            WM_SIZING = 0x0214,
            WM_CAPTURECHANGED = 0x0215,
            WM_MOVING = 0x0216,
            WM_DEVICECHANGE = 0x0219,
            WM_MDICREATE = 0x0220,
            WM_MDIDESTROY = 0x0221,
            WM_MDIACTIVATE = 0x0222,
            WM_MDIRESTORE = 0x0223,
            WM_MDINEXT = 0x0224,
            WM_MDIMAXIMIZE = 0x0225,
            WM_MDITILE = 0x0226,
            WM_MDICASCADE = 0x0227,
            WM_MDIICONARRANGE = 0x0228,
            WM_MDIGETACTIVE = 0x0229,
            WM_MDISETMENU = 0x0230,
            WM_ENTERSIZEMOVE = 0x0231,
            WM_EXITSIZEMOVE = 0x0232,
            WM_DROPFILES = 0x0233,
            WM_MDIREFRESHMENU = 0x0234,
            WM_IME_SETCONTEXT = 0x0281,
            WM_IME_NOTIFY = 0x0282,
            WM_IME_CONTROL = 0x0283,
            WM_IME_COMPOSITIONFULL = 0x0284,
            WM_IME_SELECT = 0x0285,
            WM_IME_CHAR = 0x0286,
            WM_IME_REQUEST = 0x0288,
            WM_IME_KEYDOWN = 0x0290,
            WM_IME_KEYUP = 0x0291,
            WM_MOUSEHOVER = 0x02A1,
            WM_MOUSELEAVE = 0x02A3,
            WM_CUT = 0x0300,
            WM_COPY = 0x0301,
            WM_PASTE = 0x0302,
            WM_CLEAR = 0x0303,
            WM_UNDO = 0x0304,
            WM_RENDERFORMAT = 0x0305,
            WM_RENDERALLFORMATS = 0x0306,
            WM_DESTROYCLIPBOARD = 0x0307,
            WM_DRAWCLIPBOARD = 0x0308,
            WM_PAINTCLIPBOARD = 0x0309,
            WM_VSCROLLCLIPBOARD = 0x030A,
            WM_SIZECLIPBOARD = 0x030B,
            WM_ASKCBFORMATNAME = 0x030C,
            WM_CHANGECBCHAIN = 0x030D,
            WM_HSCROLLCLIPBOARD = 0x030E,
            WM_QUERYNEWPALETTE = 0x030F,
            WM_PALETTEISCHANGING = 0x0310,
            WM_PALETTECHANGED = 0x0311,
            WM_HOTKEY = 0x0312,
            WM_PRINT = 0x0317,
            WM_PRINTCLIENT = 0x0318,
            WM_HANDHELDFIRST = 0x0358,
            WM_HANDHELDLAST = 0x035F,
            WM_AFXFIRST = 0x0360,
            WM_AFXLAST = 0x037F,
            WM_PENWINFIRST = 0x0380,
            WM_PENWINLAST = 0x038F,
            WM_APP = 0x8000,
            WM_USER = 0x0400,
            WM_DDE_INITIATE = 0x03E0,
            PRF_ERASEBKGND = 0x8,
            PRF_CLIENT = 0x4,
            WM_DDE_TERMINATE,
            WM_DDE_ADVISE,
            WM_DDE_UNADVISE,
            WM_DDE_ACK,
            WM_DDE_DATA,
            WM_DDE_REQUEST,
            WM_DDE_POKE,
            WM_DDE_EXECUTE
        }

        #region Structs

        /// <summary>
        /// 
        /// </summary>
        [StructLayout(LayoutKind.Sequential)]
        [ComVisible(false)]
        public struct LVDISPINFOW
        {
            /// <summary>
            /// 
            /// </summary>
            public NMHDR hdr;
            /// <summary>
            /// 
            /// </summary>
            public LVITEM item;
        }

        /// <summary>
        /// 
        /// </summary>
        [StructLayout(LayoutKind.Sequential)]
        [ComVisible(false)]
        public struct LVFINDINFO
        {
            /// <summary>
            /// 
            /// </summary>
            public uint flags;
            /// <summary>
            /// 
            /// </summary>
            [MarshalAs(UnmanagedType.LPWStr)]
            public string psz;
            /// <summary>
            /// 
            /// </summary>
            public IntPtr lParam;
            /// <summary>
            /// 
            /// </summary>
            public POINT pt;
            /// <summary>
            /// 
            /// </summary>
            public uint vkDirection;
        }

        /// <summary>
        /// 
        /// </summary>
        [StructLayout(LayoutKind.Sequential)]
        [ComVisible(false)]
        public struct POINT
        {
            /// <summary>
            /// 
            /// </summary>
            public int x;
            /// <summary>
            /// 
            /// </summary>
            public int y;
        }

        /// <summary>
        /// 
        /// </summary>
        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
        [ComVisible(false)]
        public struct LVITEM
        {
            /// <summary>
            /// 
            /// </summary>
            public uint mask;
            /// <summary>
            /// 
            /// </summary>
            public int IItem;
            /// <summary>
            /// 
            /// </summary>
            public int iSubItem;
            /// <summary>
            /// 
            /// </summary>
            public uint state;
            /// <summary>
            /// 
            /// </summary>
            public uint stateMask;
            /// <summary>
            /// 
            /// </summary>
            public IntPtr pszText;
            /// <summary>
            /// 
            /// </summary>
            public int cchTextMax;
            /// <summary>
            /// 
            /// </summary>
            public int iImage;
            /// <summary>
            /// 
            /// </summary>
            public IntPtr lParam;
            /// <summary>
            /// 
            /// </summary>
            public int iIndent;
            /// <summary>
            /// 
            /// </summary>
            public int iGroupId;
            /// <summary>
            /// 
            /// </summary>
            public uint cColumns;
            /// <summary>
            /// 
            /// </summary>
            public IntPtr puColumns;
        }

        /// <summary>
        /// 
        /// </summary>
        [StructLayout(LayoutKind.Sequential)]
        [ComVisible(false)]
        public struct NMHDR
        {
            /// <summary>
            /// 
            /// </summary>
            public IntPtr hwndFrom;
            /// <summary>
            /// 
            /// </summary>
            public int idFrom;
            /// <summary>
            /// 
            /// </summary>
            public int code;
        }

        /// <summary>
        /// 
        /// </summary>
        [StructLayout(LayoutKind.Sequential)]
        [ComVisible(false)]
        public struct NMLVCACHEHINT
        {
            /// <summary>
            /// 
            /// </summary>
            public NMHDR hdr;
            /// <summary>
            /// 
            /// </summary>
            public int iFrom;
            /// <summary>
            /// 
            /// </summary>
            public int iTo;
        }

        /// <summary>
        /// 
        /// </summary>
        [StructLayout(LayoutKind.Sequential)]
        [ComVisible(false)]
        public struct NMLVFINDITEM
        {
            /// <summary>
            /// 
            /// </summary>
            public NMHDR hdr;
            /// <summary>
            /// 
            /// </summary>
            public int iStart;
            /// <summary>
            /// 
            /// </summary>
            public LVFINDINFO lvfi;
        }

        /// <summary>
        /// 
        /// </summary>
        [StructLayout(LayoutKind.Sequential)]
        [ComVisible(false)]
        public struct NMLISTVIEW
        {
            /// <summary>
            /// 
            /// </summary>
            public NMHDR hdr;
            /// <summary>
            /// 
            /// </summary>
            public int IItem;
            /// <summary>
            /// 
            /// </summary>
            public int iSubItem;
            /// <summary>
            /// 
            /// </summary>
            public uint uNewState;
            /// <summary>
            /// 
            /// </summary>
            public uint uOldState;
            /// <summary>
            /// 
            /// </summary>
            public uint uChanged;
            /// <summary>
            /// 
            /// </summary>
            public POINT ptAction;
            /// <summary>
            /// 
            /// </summary>
            public IntPtr lParam;
        }

        /// <summary>
        /// 
        /// </summary>
        [StructLayout(LayoutKind.Sequential)]
        [ComVisible(false)]
        public struct RECT
        {
            /// <summary>
            /// 
            /// </summary>
            public int left;
            /// <summary>
            /// 
            /// </summary>
            public int top;
            /// <summary>
            /// 
            /// </summary>
            public int right;
            /// <summary>
            /// 
            /// </summary>
            public int bottom;
        }

        #endregion

        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount);

        [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
        static extern int GetWindowTextLength(IntPtr hWnd);




        public static string GetText(IntPtr hWnd)
        {
            // Allocate correct string length first
            int length = GetWindowTextLength(hWnd);
            StringBuilder sb = new StringBuilder(length + 1);
            GetWindowText(hWnd, sb, sb.Capacity);
            return sb.ToString();
        }


        #region Alpha Drawing
        public enum Bool
        {
            False = 0,
            True
        };


        [StructLayout(LayoutKind.Sequential)]
        public struct Point
        {
            public Int32 x;
            public Int32 y;

            public Point(Int32 x, Int32 y) { this.x = x; this.y = y; }
        }


        [StructLayout(LayoutKind.Sequential)]
        public struct Size
        {
            public Int32 cx;
            public Int32 cy;

            public Size(Int32 cx, Int32 cy) { this.cx = cx; this.cy = cy; }
        }


        [StructLayout(LayoutKind.Sequential, Pack = 1)]
        struct ARGB
        {
            public byte Blue;
            public byte Green;
            public byte Red;
            public byte Alpha;
        }


        [StructLayout(LayoutKind.Sequential, Pack = 1)]
        public struct BLENDFUNCTION
        {
            public byte BlendOp;
            public byte BlendFlags;
            public byte SourceConstantAlpha;
            public byte AlphaFormat;
        }


        public const Int32 ULW_COLORKEY = 0x00000001;
        public const Int32 ULW_ALPHA = 0x00000002;
        public const Int32 ULW_OPAQUE = 0x00000004;

        public const byte AC_SRC_OVER = 0x00;
        public const byte AC_SRC_ALPHA = 0x01;


        [DllImport("user32.dll", ExactSpelling = true, SetLastError = true)]
        public static extern Bool UpdateLayeredWindow(IntPtr hwnd, IntPtr hdcDst, ref Point pptDst, ref Size psize, IntPtr hdcSrc, ref Point pprSrc, Int32 crKey, ref BLENDFUNCTION pblend, Int32 dwFlags);

        [DllImport("user32.dll", ExactSpelling = true, SetLastError = true)]
        public static extern IntPtr GetDC(IntPtr hWnd);

        [DllImport("user32.dll", ExactSpelling = true)]
        public static extern int ReleaseDC(IntPtr hWnd, IntPtr hDC);

        [DllImport("gdi32.dll", ExactSpelling = true, SetLastError = true)]
        public static extern IntPtr CreateCompatibleDC(IntPtr hDC);

        [DllImport("gdi32.dll", ExactSpelling = true, SetLastError = true)]
        public static extern Bool DeleteDC(IntPtr hdc);

        [DllImport("gdi32.dll", ExactSpelling = true)]
        public static extern IntPtr SelectObject(IntPtr hDC, IntPtr hObject);

        [DllImport("gdi32.dll", ExactSpelling = true, SetLastError = true)]
        public static extern Bool DeleteObject(IntPtr hObject);
        #endregion
    }

   
}
